#include "ConstructorTerreno.h"
#include <fstream>

ConstructorTerreno::ConstructorTerreno(SDL_Window* ventana, float escalaY) {
	this->ventana = ventana;
	this->escalaY = escalaY;
	SDL_GetWindowSize(ventana, &ancho, &alto);
	alturasPixel = new int[ancho];
	alturasLogica = new float[ancho];
}

ConstructorTerreno::~ConstructorTerreno() {
	delete alturasPixel;
	delete alturasLogica;
}

Uint32 getPixelUint32(SDL_Surface* superficie, int x, int y) 
{
	if(SDL_MUSTLOCK(superficie)) {
		SDL_LockSurface(superficie);
	}
	Uint32 *pixels = (Uint32*)superficie->pixels;
	if(SDL_MUSTLOCK(superficie)) {
		SDL_UnlockSurface(superficie);
	}
	return pixels[(y*superficie->w) + x];
}

bool esBlanco(Uint8 rojo, Uint8 verde, Uint8 azul) {
	return (rojo == RBLANCO && verde == VBLANCO && azul == ABLANCO);
}

bool esNegro(Uint8 rojo, Uint8 verde, Uint8 azul) {
	return (rojo == RNEGRO && verde == VNEGRO && azul == ANEGRO);
}

void ConstructorTerreno::calcularAlturas() {
	Uint8 rojo, verde, azul;
	Uint32 pixel;
	for (int x = 0; x < ancho; x++) {
		int y = 0;
		bool bordeEncontrado = false;
		while (!bordeEncontrado && (y < alto)) {
			pixel = getPixelUint32(SDL_GetWindowSurface(this->ventana), x, y);
			SDL_GetRGB(pixel, SDL_GetWindowSurface(this->ventana)->format,
				&rojo, &verde, &azul);
			if (esNegro(rojo, verde, azul)) {
				bordeEncontrado = true;
			}
			y++;
		}
		alturasPixel[x] = y;
		alturasLogica[x] = (alto - y) / escalaY;
	}
}

bool ConstructorTerreno::validarMascara() {
	Uint8 rojo, verde, azul;
	Uint32 pixel;
	bool valida = true;
	int x = 0;
	while((x < ancho) && valida) {
		int y = 0;
		bool negroEncontrado = false;
		while ((y < alto) && valida) {
			pixel = getPixelUint32(SDL_GetWindowSurface(this->ventana), x, y);
			SDL_GetRGB(pixel, SDL_GetWindowSurface(this->ventana)->format,
				&rojo, &verde, &azul);
			if(esNegro(rojo, verde, azul)) {
				negroEncontrado = true;
			} else {
				if(esBlanco(rojo, verde, azul)) {
					if(negroEncontrado) {
						valida = false;
						Log::getInstance()->write(Log::ERROR, "Mezcla de blanco y negro. La mascara es invalida.");
					}
				}
			}
			y++;
		}
		x++;
	}
	return valida;
}

int* ConstructorTerreno::getAlturasPixel() {
	return alturasPixel;
}

float* ConstructorTerreno::getAlturasLogica() {
	return alturasLogica;
}


